package com.itheima.demo;

import com.itheima.service.UserService;
import com.itheima.service.impl.UserServiceImpl;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JdkProxy {
    /**
     * 代理分类:
     *  1.静态代理
     *  2.动态代理
     *      作用:在不要更改源码的情况下,对已有的方法进行增强
     *      1.JDK动态代理
     *          基于接口
     *      2.cglib动态代理
     *          基于父类
     */
    /**
     * 实现步骤:
     * 1.创建目标对象
     * 2.创建代理对象
     */
    public static void main(String[] args) {
        final UserServiceImpl usi = new UserServiceImpl();
        /**
         * jdk动态代理
         *     涉及的类:proxy
         *     创建代理对象的方法:newProxyInstance
         *      三个参数:
         *          第一个参数:目标对象的类的加载器(固定写法)
         *          第二个参数:目标对象所实现的接口(固定写法)
         *             第三个参数:代理具体实现(程序自己实现)
         */
        UserService obj = (UserService) Proxy.newProxyInstance(usi.getClass().getClassLoader(), usi.getClass().getInterfaces(), new InvocationHandler() {
            /**
             *
             * @param proxy     代理对象
             * @param method    执行的目标方法对象
             * @param args      执行目标方法对象上的参数列表
             * @return
             * @throws Throwable
             */
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //proxy = usi;
                System.out.println("执行的方法名称:" + method.getName());
                System.out.println(method);
                System.out.println("中国人");
                method.invoke(usi, args);//继续执行usi对象上带有args参数列表的method方法
                System.out.println("...");
                return null;
            }
        });
        obj.say();
    }

}
